
很多初学Linux的朋友，一开始还不怎么理解Linux的输出重定向和错误重定向。同样的，很多初学C++语言的朋友，也并不理解\texttt{std::cout}和\texttt{std::cerr}的本质区别，感觉他们似乎是一样的。

提示：Linux的标准输出重定向/标准错误重定向，可以和C++的标准输出流/标准错误流结合起来学习，两者结合起来更容易理解。而且，从这个角度讲，C++与Linux系统是一致的。

（关于Linux中标准输出重定向/标准错误重定向，和C++中的\texttt{std::cout}/\texttt{std::cerr}知识，请参考相应的书目）

下面用一个C++程序来演示Linux系统的重定向：

程序的代码：
\begin{shaded}
\begin{verbatim}
// Filename: redirection.cpp
// Author: renewjoy
// Date: Sun Aug 24 13:42:06 CST 2008
// Function: 演示标准输出流和标准错误流

#include <iostream>

int main()
{
  std::cout << "This a standard out stream!" << std::endl;
  std::cerr << "This a standard error stream!" << std::endl;

  return 0;
}
\end{verbatim}
\end{shaded}

编译程序：\texttt{g++ -o redirection redirection.cpp}

以下是程序的几种运行方式：

0、直接运行程序
\begin{shaded}
\begin{verbatim}
renewjoy@ubuntu:cpp$ ./redirection 		#输出结果说明，标准输出设备和标准错误设备，都默认为屏幕（显示器）。
This a standard out stream!
This a standard error stream!
\end{verbatim}
\end{shaded}

1、将标准输出重定向到文件output.txt
\begin{shaded}
\begin{verbatim}
renewjoy@ubuntu:cpp$ ./redirection > output.txt     #把程序的标准输出重定向到output.txt文件中.此时，标准错误设备仍为屏幕
This a standard error stream!
renewjoy@ubuntu:cpp$ cat output.txt			#查看文件output.txt的内容
This a standard out stream!
\end{verbatim}
\end{shaded}

2、将标准错误重定向到文件error.txt
\begin{shaded}
\begin{verbatim}
renewjoy@ubuntu:cpp$ ./redirection 2> error.txt		#程序的输出结果为C++程序中“标准输出流”语句的内容
This a standard out stream!
renewjoy@ubuntu:cpp$ cat error.txt			#查看文件error.txt的内容
This a standard error stream!
\end{verbatim}
\end{shaded}

3、将标准输出、标准错误分别重定向到不同文件：
\begin{shaded}
\begin{verbatim}
renewjoy@ubuntu:cpp$ ./redirection 1> output_cp.txt 2> error_cp.txt   #此时屏幕没有任何输出
renewjoy@ubuntu:cpp$ cat output_cp.txt 					#查看标准输出文件
This a standard out stream!
renewjoy@ubuntu:cpp$ cat error_cp.txt 					#查看标准错误文件
This a standard error stream!
\end{verbatim}
\end{shaded}

4、将标准输出与标准错误定向到同一文件：
\begin{shaded}
\begin{verbatim}
renewjoy@ubuntu:cpp$ ./redirection > output_error.txt 2>&1           #此时屏幕没有任何输出
renewjoy@ubuntu:cpp$ cat output_error.txt 			 	#查看文件内容
This a standard out stream!
This a standard error stream!
\end{verbatim}
\end{shaded}

\begin{flushright}
  \hyperref[content]{回到目录}
\end{flushright}